Make Operation Name required by Analyzer API
以下のクエリだとPaidUsersがOperation Nameです。
code:graphql
query PaidUsers {
users(status: PAID) {
id
}
}
Operation Nameはクエリの実行自体には特に影響を与えませんがロギングなどに有用です。GraphQLのクエリは基本的に静的な文字列なのでOperation Nameのログを残すことでクライアントのコードを検索して問題を起こしているクエリを発見するなどの調査を容易にしてくれます。
しかしながらデフォルトではOperation Nameは省略可能なため、確実に残したい場合は何らかのValidationをする必要があります。このValidationをAnalyzer APIを使って以下のように実装することができます。 code:ruby
module Analyzers
class OperationNameRequired
def initial_value(query)
GraphQL::AnalysisError.new('You must provide a operation name') unless query.operation_name
end
def call(error, _, _)
error
end
def final_value(error)
error
end
end
end
GraphiqlからはOperation Name無しで{ users { id } }と書きたいという場合はcontextにリファラを渡して判定することなどもできるでしょう。
code:ruby
# Schema.execute(query: query, context: { referer: request.referer })
def initial_value(query)
unless query.context:referer =~ /graphiql/ GraphQL::AnalysisError.new('You must provide a operation name') unless query.operation_name
end
end